#pragma once

#include "Camera.h"
#include "ClickScene.h"
#include "DrawScene.h"
#include "Lighting.h"
#include <afxwin.h>

// 取消这两个宏，防止与自定义函数冲突
#undef min
#undef max

/**
 * @file Scene.h
 * @author xingyifan
 * @date 2023-01-11 12:57
 *
 * @description: 场景交互数据结构
 */

class scene_data
{
public:
	int choose;	  // 选中的网格索引
	GLenum face;  // 绘制的网格面
	GLenum mode;  // 绘制模式

public:
	// 数据初始化
	scene_data() : choose(-1), face(GL_FRONT_AND_BACK), mode(GL_FILL) {}
};

/**
 * @file Scene.h
 * @author xingyifan
 * @date 2022-12-31 22:26
 *
 * @description: 封装 OpenGL 的控制操作
 */

class Scene
{
public:
	/**
	 * @file Scene.h
	 * @author xingyifan
	 * @date 2023-01-11 10:45
	 *
	 * @description: 窗口数据
	 */

	HGLRC m_hglrc;	   // 绘图 RC
	CFrameWnd *m_pWnd; // 窗口指针
	Camera *m_camera;  // 相机指针
	scene_data m_data; // 交互数据

	/**
	 * @file Scene.h
	 * @author xingyifan
	 * @date 2023-01-11 11:13
	 *
	 * @description: 场景方法和数据列表
	 */

	std::deque<Lighting *> m_lList;	   // 光照条件列表
	std::deque<CG::Mesh *> m_mList;	   // 网格模型列表
	std::deque<ClickScene *> m_csList; // 用于点击操作
	std::deque<DrawScene *> m_dsList;  // 用于绘制操作

public:
	Scene(CFrameWnd *pWnd, Camera *camera);
	~Scene();

	/**
	 * @file Scene.h
	 * @author xingyifan
	 * @date 2023-01-11 13:49
	 *
	 * @description: 设置 RC 载入状态
	 */

	void LoadRC();
	void RemoveRC();

	/**
	 * @file Scene.h
	 * @author xingyifan
	 * @date 2023-01-10 23:11
	 *
	 * @description: 网格操作
	 */

	int CreateMesh();		  // 创建一个空网格，返回索引
	bool DeleteMesh(int i);	  // 销毁一个网格
	void RegisterMesh(int i); // 注册一个网格信息

	/**
	 * @file Scene.h
	 * @author xingyifan
	 * @date 2023-01-10 23:17
	 *
	 * @description: 光照条件
	 */

	int CreateLighting(CG::coord4f pos, float L[][3], float *reduce); // 设置光照参数，返回索引
	bool DeleteLighting(int i);										  // 销毁光照

	/**
	 * @file Scene.h
	 * @author xingyifan
	 * @date 2023-01-11 11:39
	 *
	 * @description: 设置绘图和交互操作
	 */

	int CreateClick(ClickType type); // 创建点击方法
	int CreateDraw(DrawType type);	 // 创建绘图方法
	bool DeleteClick(int i);		 // 删除点击方法
	bool DeleteDraw(int i);			 // 删除绘图方法

	/**
	 * @file Scene.h
	 * @author xingyifan
	 * @date 2023-01-10 23:17
	 *
	 * @description: 绘图操作
	 */

	void Redraw(); // 重绘场景
	void Draw();   // 绘制场景
	void Click();  // 点击操作
};